梯度下降

Note

梯度下降法是最基本的优化算法,但一次更新慢
随机梯度下降一次只使用一个样本的梯度进行更新,但随机性大且数据效率低
小批量随机梯度下降相对最好

梯度下降

目标函数 \(f: \mathbb{R}^{d} \to \mathbb{R}\) 的泰勒展开式为:

\[f(\mathbf{x} + \epsilon) = f(\mathbf{x}) + \epsilon^{T}\nabla{f(\mathbf{x})} + \mathcal{O}(\left \| \epsilon \right \|^2)\]

由此可以看出,\(f\) 下降最快的方向是梯度的反方向 \(-\nabla{f(\mathbf{x})}\)。由此可推导出梯度下降法:

\[\mathbf{x}_{t} = \mathbf{x}_{t-1} - \eta\nabla{f(\mathbf{x}_{t-1})}\]

其中 \(\eta > 0\) 是学习率.

jupyter

随机梯度下降

在深度学习中,目标函数是所有训练样本的损失函数的均值:

\[f(\mathbf{x}) = \frac{1}{n}\sum_{i=1}^{n}f_{i}(\mathbf{x})\]

梯度:

\[\nabla{f(\mathbf{x})} = \frac{1}{n}\sum_{i=1}^{n}\nabla{f_{i}(\mathbf{x})}\]

在梯度下降中,每一次更新的时间复杂度为 \(\mathcal{O}(n)\), 当训练集很大时更新会很慢。

随机梯度下降(Stochastic gradient descent,SGD) 每次更新会随机选取一个样本,仅使用此样本的梯度进行更新:

\[\mathbf{x}_{t} = \mathbf{x}_{t-1} - \eta\nabla{f_{i}(\mathbf{x}_{t-1})}\]

时间复杂度为 \(\mathcal{O}(1)\)

小批量随机梯度下降

梯度下降更新太慢。

SGD更新次数太多,随机性大,不能充分使用矢量化加速运算(数据效率低)。

小批量随机梯度下降介乎两者之间,每次会使用一小批量(比如说64个、128个等)的样本来进行更新。它可以充分使用矢量化加速运算,随机性也可以接受。

\[\mathbf{x}_{t} = \mathbf{x}_{t-1} - \frac{\eta}{|\mathcal{B}_{t}|}\sum_{i\in\mathcal{B}_{t}}\nabla{f_{i}(\mathbf{x}_{t-1})}\]
import torch
from torch import nn

net = nn.Sequential(nn.Linear(3, 1))
# 实际上就是小批量随机梯度下降,batch_size在data_iter中定义
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)